#ifndef GSMIO_H_

#include <cross_studio_io.h>
#include <targets/lpc2000.h>

#include "../../fatfs/ff.h"
#include "../../utils/rtea/rtea.h"
#include "../../utils/json/json.h"
#include "../../drivers/led.h"
#include "../../drivers/wdt.h"
#include "../modem.h"
#include "../timer.h"

//#define HW_ver 5



#if HW_ver==5 // версия прописана в опциях проекта для препроцессора
// подача питания на модем
#define GSM_PWR_ON_PIN      8
#define GSM_PWR_DIRPORT     FIO2DIR
#define GSM_PWR_ON_SETPORT  FIO2SET
#define GSM_PWR_ON_CLRPORT  FIO2CLR

#elif HW_ver==4
// подача питания на модем
#define GSM_PWR_ON_PIN      31
#define GSM_PWR_DIRPORT     FIO1DIR
#define GSM_PWR_ON_SETPORT  FIO1SET
#define GSM_PWR_ON_CLRPORT  FIO1CLR

#else
#define GSMIO_PULLUPS_OFF()   {PINMODE4 = (PINMODE4 & ~0x0000FFFF) | 0x0000AAAA;}
#define GSMIO_POWER_ON()      {FIO4DIR |= 0x10000000; FIO4CLR =  0x10000000;}
#define GSMIO_POWER_OFF()     {FIO4DIR |= 0x10000000; FIO4SET =  0x10000000;}
#define GSMIO_SET_KEY()       {FIO2DIR |= 0x00000100; FIO2SET =  0x00000100;}
#define GSMIO_CLR_KEY()       {FIO2DIR |= 0x00000100; FIO2CLR =  0x00000100;}

#define GSMIO_SIM(n)          ((n==GSM_SIM1)?(GSMIO_SIM1()):(GSMIO_SIM2()))
#define GSMIO_SIM1()          {FIO2DIR |= 0x00000200; FIO2SET =  0x00000200;}
#define GSMIO_SIM2()          {FIO2DIR |= 0x00000200; FIO2CLR =  0x00000200;}
#endif

#if (HW_ver==4 )||(HW_ver==5)
//дискретные выходы GSM-модема
// переключение SIM-карт
#define GSM_SIM_PIN     3
#define GSM_SIM_DIRPORT FIO2DIR
#define GSM_SIM_SETPORT FIO2SET
#define GSM_SIM_CLRPORT FIO2CLR

// 'кнопка' включения модема
#define GSM_KEY_PIN         6
#define GSM_KEY_DIRPORT     FIO2DIR
#define GSM_KEY_SETPORT     FIO2SET
#define GSM_KEY_CLRPORT     FIO2CLR

// RTS1 на GSM-модем
#define RTS1_PIN            7
#define RTS1_DIRPORT        FIO2DIR
#define RTS1_SETPORT        FIO2SET
#define RTS1_CLRPORT        FIO2CLR

void  GSMIO_PULLUPS_OFF(void);
void  GSMIO_POWER_ON(void);
void  GSMIO_POWER_OFF(void);
void  GSMIO_SET_KEY(void);
void GSMIO_CLR_KEY();
void GSMIO_SIM(GSM_SIM_t n);
void GSMIO_SIM1(void);
void GSMIO_SIM2(void);

/*
#define GSM_SIM_0()         GSM_SIM_CLRPORT=(1<<GSM_SIM_PIN)
#define GSM_SIM_1()         GSM_SIM_SETPORT=(1<<GSM_SIM_PIN)

#define GSM_KEY_ON()        GSM_KEY_CLRPORT=(1<<GSM_KEY_PIN)
#define GSM_KEY_OFF()       GSM_KEY_SETPORT=(1<<GSM_KEY_PIN)

#define GSM_POWER_ON()      GSM_PWR_ON_CLRPORT=(1<<GSM_PWR_ON_PIN)
#define GSM_POWER_OFF()     GSM_PWR_ON_SETPORT=(1<<GSM_PWR_ON_PIN)
*/


#endif





typedef enum
{
  GSM_CMD_OK = 0,
  GSM_CMD_TIMEOUT,
  GSM_CMD_ERROR,
  GSM_CMD_FORMAT
} GSM_CMD_t;

GSM_CMD_t gsmio_command(char* cmd, char* resp, int timeout_ms);
GSM_CMD_t gsmio_command_n(char* cmd, int len, char* resp, int timeout_ms, char flush);

void gsmio_power_on();
void gsmio_power_off();

void gsmio_on();

GSM_CMD_t gsmio_json_receive(unsigned long timeout_ms, json_node** output);
GSM_CMD_t gsmio_http_receive(FIL* file, unsigned int *crc32, unsigned long timeout_ms);


#endif /*GSMIO_H_*/